psyctests_info <- readRDS("../sober_rubric/raw_data/psyctests_info.rds")

In the following, you see treemaps. In these plots, the area per test is proportional to its usage frequency. In the plots, tests which have been rarely used according to APA PsycInfo are grouped, mainly so that the individually small tiles are still visible despite their low frequency.

By comparing across the subdisciplines, we can see what higher and lower entropy fields look like visually. High entropy is seen as great fragmentation, i.e. there are many tiles of similar size and the “used 1-5 times” and “used 6-20 times” tiles are prominent. Lower fragmentation is apparent when some large tiles reflecting individual measures, such as the Beck Depression Inventory, dominate a field.

tests <- psyctests_info %>% 
  group_by(DOI, Name) %>% 
  summarise(n = sum(usage_count, na.rm = T),
            parent = case_when(
                    n > 50 ~ "",
                    n > 20 ~ "used 21-50 times",
                    n > 5 ~ "used 6-20 times",
                    TRUE ~ "used 1-5 times"))
entropy = entropy(tests$n)
norm_entropy = calc_norm_entropy(tests$n)

tests <- bind_rows(tests, 
                   tests %>% filter(parent != "") %>% 
                     ungroup() %>% 
                     select(Name = parent) %>% distinct() %>% mutate(n=0, parent = ""))

Overall

Normalized Shannon entropy \(\eta(X) = 0.71\)

fig <- plot_ly(
  type='treemap',
  labels = tests$Name,
  parents = tests$parent,
  values= tests$n,
  text = tests$DOI,
  tiling = list(packing = "squarify", squarifyratio = (1 + sqrt(5)) / 2),
  hoverinfo="label+value+text",
  textinfo="label+value")

fig %>% layout(
  autosize = TRUE,
  margin = list(l = 0, t = 0, r = 0 , b = 0)
)
tests <- psyctests_info %>% 
  filter(subdiscipline_1 == "Personality and Social Psychology") %>% 
  group_by(DOI, Name) %>% 
  summarise(n = sum(usage_count, na.rm = T),
            parent = case_when(
                    n > 20 ~ "",
                    n > 5 ~ "used 6-20 times",
                    TRUE ~ "used 1-5 times"))
entropy = entropy(tests$n)
norm_entropy = calc_norm_entropy(tests$n)

tests <- bind_rows(tests, 
                   tests %>% filter(parent != "") %>% 
                     ungroup() %>% 
                     select(Name = parent) %>% distinct() %>% mutate(n=0, parent = ""))

Personality and Social Psychology

Normalized Shannon entropy \(\eta(X) = 0.75\)

fig <- plot_ly(
  type='treemap',
  labels = tests$Name,
  parents = tests$parent,
  values= tests$n,
  text = tests$DOI,
  tiling = list(packing = "squarify", squarifyratio = (1 + sqrt(5)) / 2),
  hoverinfo="label+value+text",
  textinfo="label+value")

fig %>% layout(
  autosize = TRUE,
  margin = list(l = 0, t = 0, r = 0 , b = 0)
)
tests <- psyctests_info %>%
  filter(subdiscipline_1 == "Industrial/Organizational Psychology") %>%
  group_by(DOI, Name) %>%
  summarise(n = sum(usage_count, na.rm = T),
            parent = case_when(
                    n > 20 ~ "",
                    n > 5 ~ "used 6-20 times",
                    TRUE ~ "used 1-5 times"))
entropy = entropy(tests$n)
norm_entropy = calc_norm_entropy(tests$n)

tests <- bind_rows(tests,
                   tests %>% filter(parent != "") %>%
                     ungroup() %>%
                     select(Name = parent) %>% distinct() %>% mutate(n=0, parent = ""))

Industrial/Organizational Psychology

Normalized Shannon entropy \(\eta(X) = 0.80\)

fig <- plot_ly(
  type='treemap',
  labels = tests$Name,
  parents = tests$parent,
  values= tests$n,
  text = tests$DOI,
  tiling = list(packing = "squarify", squarifyratio = (1 + sqrt(5)) / 2),
  hoverinfo="label+value+text",
  textinfo="label+value")

fig %>% layout(
  autosize = TRUE,
  margin = list(l = 0, t = 0, r = 0 , b = 0)
)
tests <- psyctests_info %>%
  filter(subdiscipline_1 == "Health and Clinical Psychology") %>%
  group_by(DOI, Name) %>%
  summarise(n = sum(usage_count, na.rm = T),
            parent = case_when(
                    n > 20 ~ "",
                    n > 5 ~ "used 6-20 times",
                    TRUE ~ "used 1-5 times"))
entropy = entropy(tests$n)
norm_entropy = calc_norm_entropy(tests$n)

tests <- bind_rows(tests,
                   tests %>% filter(parent != "") %>%
                     ungroup() %>%
                     select(Name = parent) %>% distinct() %>% mutate(n=0, parent = ""))

Health and Clinical Psychology

Normalized Shannon entropy \(\eta(X) = 0.66\)

fig <- plot_ly(
  type='treemap',
  labels = tests$Name,
  parents = tests$parent,
  values= tests$n,
  text = tests$DOI,
  tiling = list(packing = "squarify", squarifyratio = (1 + sqrt(5)) / 2),
  hoverinfo="label+value+text",
  textinfo="label+value")

fig %>% layout(
  autosize = TRUE,
  margin = list(l = 0, t = 0, r = 0 , b = 0)
)
tests <- psyctests_info %>%
  filter(subdiscipline_1 == "Educational and Developmental Psychology") %>%
  group_by(DOI, Name) %>%
  summarise(n = sum(usage_count, na.rm = T),
            parent = case_when(
                    n > 20 ~ "",
                    n > 5 ~ "used 6-20 times",
                    TRUE ~ "used 1-5 times"))
entropy = entropy(tests$n)
norm_entropy = calc_norm_entropy(tests$n)

tests <- bind_rows(tests,
                   tests %>% filter(parent != "") %>%
                     ungroup() %>%
                     select(Name = parent) %>% distinct() %>% mutate(n=0, parent = ""))

Educational and Developmental Psychology

Normalized Shannon entropy \(\eta(X) = 0.72\)

fig <- plot_ly(
  type='treemap',
  labels = tests$Name,
  parents = tests$parent,
  values= tests$n,
  text = tests$DOI,
  tiling = list(packing = "squarify", squarifyratio = (1 + sqrt(5)) / 2),
  hoverinfo="label+value+text",
  textinfo="label+value")

fig %>% layout(
  autosize = TRUE,
  margin = list(l = 0, t = 0, r = 0 , b = 0)
)
tests <- psyctests_info %>%
  filter(subdiscipline_1 == "Cognitive Psychology") %>%
  group_by(DOI, Name) %>%
  summarise(n = sum(usage_count, na.rm = T),
            parent = case_when(
                    n > 20 ~ "",
                    n > 5 ~ "used 6-20 times",
                    TRUE ~ "used 1-5 times"))
entropy = entropy(tests$n)
norm_entropy = calc_norm_entropy(tests$n)

tests <- bind_rows(tests,
                   tests %>% filter(parent != "") %>%
                     ungroup() %>%
                     select(Name = parent) %>% distinct() %>% mutate(n=0, parent = ""))

Cognitive Psychology

Normalized Shannon entropy \(\eta(X) = 0.66\)

fig <- plot_ly(
  type='treemap',
  labels = tests$Name,
  parents = tests$parent,
  values= tests$n,
  text = tests$DOI,
  tiling = list(packing = "squarify", squarifyratio = (1 + sqrt(5)) / 2),
  hoverinfo="label+value+text",
  textinfo="label+value")

fig %>% layout(
  autosize = TRUE,
  margin = list(l = 0, t = 0, r = 0 , b = 0)
)
LS0tCnRpdGxlOiAiQ29uc3RydWN0IHByb2xpZmVyYXRpb24iCmF1dGhvcjogIlJ1YmVuIEFyc2xhbiIKZGF0ZTogIjIwMjMtMDMtMzEiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6ICJoaWRlIgplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQotLS0KCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBlcnJvciA9IFQsIHdhcm5pbmcgPSBGLCBtZXNzYWdlID0gRikKCmxpYnJhcnkoZ3JvdW5kaG9nKQpncm91bmRob2cubGlicmFyeShjKCJ0aWR5dmVyc2UiLCAiZW50cm9weSIsICJnZ3JlcGVsIiwgImNvd3Bsb3QiLCAia25pdHIiLCAicmVhZHIiLAogICAgICAgICAgICAgICAgICAgICJSQ29sb3JCcmV3ZXIiLCAicGxvdGx5IiwgImdnbG9yZW56IiwgInJpbyIsICJocmJydGhlbWVzIiksIAogICAgICAgICAgICAgICAgICBkYXRlID0gIjIwMjQtMDItMjQiKQp0aGVtZV9zZXQodGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNCkpCgpjYWxjX25vcm1fZW50cm9weSA8LSBmdW5jdGlvbihuKSB7CiAgbiA8LSBuW24+MF0KICBlbnRyb3B5OjplbnRyb3B5KG4pL2xvZyhsZW5ndGgobikpCn0KYGBgCgpgYGB7cn0KcHN5Y3Rlc3RzX2luZm8gPC0gcmVhZFJEUygiLi4vc29iZXJfcnVicmljL3Jhd19kYXRhL3BzeWN0ZXN0c19pbmZvLnJkcyIpCmBgYAoKSW4gdGhlIGZvbGxvd2luZywgeW91IHNlZSB0cmVlbWFwcy4gSW4gdGhlc2UgcGxvdHMsIHRoZSBhcmVhIHBlciB0ZXN0IGlzIHByb3BvcnRpb25hbCB0byBpdHMgdXNhZ2UgZnJlcXVlbmN5LiBJbiB0aGUgcGxvdHMsIHRlc3RzIHdoaWNoIGhhdmUgYmVlbiByYXJlbHkgdXNlZCBhY2NvcmRpbmcgdG8gQVBBIFBzeWNJbmZvIGFyZSBncm91cGVkLCBtYWlubHkgc28gdGhhdCB0aGUgaW5kaXZpZHVhbGx5IHNtYWxsIHRpbGVzIGFyZSBzdGlsbCB2aXNpYmxlIGRlc3BpdGUgdGhlaXIgbG93IGZyZXF1ZW5jeS4gCgpCeSBjb21wYXJpbmcgYWNyb3NzIHRoZSBzdWJkaXNjaXBsaW5lcywgd2UgY2FuIHNlZSB3aGF0IGhpZ2hlciBhbmQgbG93ZXIgZW50cm9weSBmaWVsZHMgbG9vayBsaWtlIHZpc3VhbGx5LiBIaWdoIGVudHJvcHkgaXMgc2VlbiBhcyBncmVhdCBmcmFnbWVudGF0aW9uLCBpLmUuIHRoZXJlIGFyZSBtYW55IHRpbGVzIG9mIHNpbWlsYXIgc2l6ZSBhbmQgdGhlICJ1c2VkIDEtNSB0aW1lcyIgYW5kICJ1c2VkIDYtMjAgdGltZXMiIHRpbGVzIGFyZSBwcm9taW5lbnQuIExvd2VyIGZyYWdtZW50YXRpb24gaXMgYXBwYXJlbnQgd2hlbiBzb21lIGxhcmdlIHRpbGVzIHJlZmxlY3RpbmcgaW5kaXZpZHVhbCBtZWFzdXJlcywgc3VjaCBhcyB0aGUgQmVjayBEZXByZXNzaW9uIEludmVudG9yeSwgZG9taW5hdGUgYSBmaWVsZC4KCmBgYHtyfQp0ZXN0cyA8LSBwc3ljdGVzdHNfaW5mbyAlPiUgCiAgZ3JvdXBfYnkoRE9JLCBOYW1lKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBzdW0odXNhZ2VfY291bnQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIHBhcmVudCA9IGNhc2Vfd2hlbigKICAgICAgICAgICAgICAgICAgICBuID4gNTAgfiAiIiwKICAgICAgICAgICAgICAgICAgICBuID4gMjAgfiAidXNlZCAyMS01MCB0aW1lcyIsCiAgICAgICAgICAgICAgICAgICAgbiA+IDUgfiAidXNlZCA2LTIwIHRpbWVzIiwKICAgICAgICAgICAgICAgICAgICBUUlVFIH4gInVzZWQgMS01IHRpbWVzIikpCmVudHJvcHkgPSBlbnRyb3B5KHRlc3RzJG4pCm5vcm1fZW50cm9weSA9IGNhbGNfbm9ybV9lbnRyb3B5KHRlc3RzJG4pCgp0ZXN0cyA8LSBiaW5kX3Jvd3ModGVzdHMsIAogICAgICAgICAgICAgICAgICAgdGVzdHMgJT4lIGZpbHRlcihwYXJlbnQgIT0gIiIpICU+JSAKICAgICAgICAgICAgICAgICAgICAgdW5ncm91cCgpICU+JSAKICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KE5hbWUgPSBwYXJlbnQpICU+JSBkaXN0aW5jdCgpICU+JSBtdXRhdGUobj0wLCBwYXJlbnQgPSAiIikpCmBgYAoKCiMjIE92ZXJhbGwKIyMjIE5vcm1hbGl6ZWQgU2hhbm5vbiBlbnRyb3B5IGByIHNwcmludGYoIiRcXGV0YShYKSA9ICUuMmYkIiwgbm9ybV9lbnRyb3B5KWAKYGBge3IsIG91dC53aWR0aD0nMTAwJSd9CmZpZyA8LSBwbG90X2x5KAogIHR5cGU9J3RyZWVtYXAnLAogIGxhYmVscyA9IHRlc3RzJE5hbWUsCiAgcGFyZW50cyA9IHRlc3RzJHBhcmVudCwKICB2YWx1ZXM9IHRlc3RzJG4sCiAgdGV4dCA9IHRlc3RzJERPSSwKICB0aWxpbmcgPSBsaXN0KHBhY2tpbmcgPSAic3F1YXJpZnkiLCBzcXVhcmlmeXJhdGlvID0gKDEgKyBzcXJ0KDUpKSAvIDIpLAogIGhvdmVyaW5mbz0ibGFiZWwrdmFsdWUrdGV4dCIsCiAgdGV4dGluZm89ImxhYmVsK3ZhbHVlIikKCmZpZyAlPiUgbGF5b3V0KAogIGF1dG9zaXplID0gVFJVRSwKICBtYXJnaW4gPSBsaXN0KGwgPSAwLCB0ID0gMCwgciA9IDAgLCBiID0gMCkKKQpgYGAKCgpgYGB7cn0KdGVzdHMgPC0gcHN5Y3Rlc3RzX2luZm8gJT4lIAogIGZpbHRlcihzdWJkaXNjaXBsaW5lXzEgPT0gIlBlcnNvbmFsaXR5IGFuZCBTb2NpYWwgUHN5Y2hvbG9neSIpICU+JSAKICBncm91cF9ieShET0ksIE5hbWUpICU+JSAKICBzdW1tYXJpc2UobiA9IHN1bSh1c2FnZV9jb3VudCwgbmEucm0gPSBUKSwKICAgICAgICAgICAgcGFyZW50ID0gY2FzZV93aGVuKAogICAgICAgICAgICAgICAgICAgIG4gPiAyMCB+ICIiLAogICAgICAgICAgICAgICAgICAgIG4gPiA1IH4gInVzZWQgNi0yMCB0aW1lcyIsCiAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJ1c2VkIDEtNSB0aW1lcyIpKQplbnRyb3B5ID0gZW50cm9weSh0ZXN0cyRuKQpub3JtX2VudHJvcHkgPSBjYWxjX25vcm1fZW50cm9weSh0ZXN0cyRuKQoKdGVzdHMgPC0gYmluZF9yb3dzKHRlc3RzLCAKICAgICAgICAgICAgICAgICAgIHRlc3RzICU+JSBmaWx0ZXIocGFyZW50ICE9ICIiKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChOYW1lID0gcGFyZW50KSAlPiUgZGlzdGluY3QoKSAlPiUgbXV0YXRlKG49MCwgcGFyZW50ID0gIiIpKQpgYGAKCgojIyBQZXJzb25hbGl0eSBhbmQgU29jaWFsIFBzeWNob2xvZ3kKIyMjIE5vcm1hbGl6ZWQgU2hhbm5vbiBlbnRyb3B5IGByIHNwcmludGYoIiRcXGV0YShYKSA9ICUuMmYkIiwgbm9ybV9lbnRyb3B5KWAKYGBge3IsIG91dC53aWR0aD0nMTAwJSd9CmZpZyA8LSBwbG90X2x5KAogIHR5cGU9J3RyZWVtYXAnLAogIGxhYmVscyA9IHRlc3RzJE5hbWUsCiAgcGFyZW50cyA9IHRlc3RzJHBhcmVudCwKICB2YWx1ZXM9IHRlc3RzJG4sCiAgdGV4dCA9IHRlc3RzJERPSSwKICB0aWxpbmcgPSBsaXN0KHBhY2tpbmcgPSAic3F1YXJpZnkiLCBzcXVhcmlmeXJhdGlvID0gKDEgKyBzcXJ0KDUpKSAvIDIpLAogIGhvdmVyaW5mbz0ibGFiZWwrdmFsdWUrdGV4dCIsCiAgdGV4dGluZm89ImxhYmVsK3ZhbHVlIikKCmZpZyAlPiUgbGF5b3V0KAogIGF1dG9zaXplID0gVFJVRSwKICBtYXJnaW4gPSBsaXN0KGwgPSAwLCB0ID0gMCwgciA9IDAgLCBiID0gMCkKKQpgYGAKCgpgYGB7cn0KdGVzdHMgPC0gcHN5Y3Rlc3RzX2luZm8gJT4lCiAgZmlsdGVyKHN1YmRpc2NpcGxpbmVfMSA9PSAiSW5kdXN0cmlhbC9Pcmdhbml6YXRpb25hbCBQc3ljaG9sb2d5IikgJT4lCiAgZ3JvdXBfYnkoRE9JLCBOYW1lKSAlPiUKICBzdW1tYXJpc2UobiA9IHN1bSh1c2FnZV9jb3VudCwgbmEucm0gPSBUKSwKICAgICAgICAgICAgcGFyZW50ID0gY2FzZV93aGVuKAogICAgICAgICAgICAgICAgICAgIG4gPiAyMCB+ICIiLAogICAgICAgICAgICAgICAgICAgIG4gPiA1IH4gInVzZWQgNi0yMCB0aW1lcyIsCiAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJ1c2VkIDEtNSB0aW1lcyIpKQplbnRyb3B5ID0gZW50cm9weSh0ZXN0cyRuKQpub3JtX2VudHJvcHkgPSBjYWxjX25vcm1fZW50cm9weSh0ZXN0cyRuKQoKdGVzdHMgPC0gYmluZF9yb3dzKHRlc3RzLAogICAgICAgICAgICAgICAgICAgdGVzdHMgJT4lIGZpbHRlcihwYXJlbnQgIT0gIiIpICU+JQogICAgICAgICAgICAgICAgICAgICB1bmdyb3VwKCkgJT4lCiAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChOYW1lID0gcGFyZW50KSAlPiUgZGlzdGluY3QoKSAlPiUgbXV0YXRlKG49MCwgcGFyZW50ID0gIiIpKQpgYGAKCgojIyBJbmR1c3RyaWFsL09yZ2FuaXphdGlvbmFsIFBzeWNob2xvZ3kKIyMjIE5vcm1hbGl6ZWQgU2hhbm5vbiBlbnRyb3B5IGByIHNwcmludGYoIiRcXGV0YShYKSA9ICUuMmYkIiwgbm9ybV9lbnRyb3B5KWAKYGBge3IsIG91dC53aWR0aD0nMTAwJSd9CmZpZyA8LSBwbG90X2x5KAogIHR5cGU9J3RyZWVtYXAnLAogIGxhYmVscyA9IHRlc3RzJE5hbWUsCiAgcGFyZW50cyA9IHRlc3RzJHBhcmVudCwKICB2YWx1ZXM9IHRlc3RzJG4sCiAgdGV4dCA9IHRlc3RzJERPSSwKICB0aWxpbmcgPSBsaXN0KHBhY2tpbmcgPSAic3F1YXJpZnkiLCBzcXVhcmlmeXJhdGlvID0gKDEgKyBzcXJ0KDUpKSAvIDIpLAogIGhvdmVyaW5mbz0ibGFiZWwrdmFsdWUrdGV4dCIsCiAgdGV4dGluZm89ImxhYmVsK3ZhbHVlIikKCmZpZyAlPiUgbGF5b3V0KAogIGF1dG9zaXplID0gVFJVRSwKICBtYXJnaW4gPSBsaXN0KGwgPSAwLCB0ID0gMCwgciA9IDAgLCBiID0gMCkKKQpgYGAKCgpgYGB7cn0KdGVzdHMgPC0gcHN5Y3Rlc3RzX2luZm8gJT4lCiAgZmlsdGVyKHN1YmRpc2NpcGxpbmVfMSA9PSAiSGVhbHRoIGFuZCBDbGluaWNhbCBQc3ljaG9sb2d5IikgJT4lCiAgZ3JvdXBfYnkoRE9JLCBOYW1lKSAlPiUKICBzdW1tYXJpc2UobiA9IHN1bSh1c2FnZV9jb3VudCwgbmEucm0gPSBUKSwKICAgICAgICAgICAgcGFyZW50ID0gY2FzZV93aGVuKAogICAgICAgICAgICAgICAgICAgIG4gPiAyMCB+ICIiLAogICAgICAgICAgICAgICAgICAgIG4gPiA1IH4gInVzZWQgNi0yMCB0aW1lcyIsCiAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJ1c2VkIDEtNSB0aW1lcyIpKQplbnRyb3B5ID0gZW50cm9weSh0ZXN0cyRuKQpub3JtX2VudHJvcHkgPSBjYWxjX25vcm1fZW50cm9weSh0ZXN0cyRuKQoKdGVzdHMgPC0gYmluZF9yb3dzKHRlc3RzLAogICAgICAgICAgICAgICAgICAgdGVzdHMgJT4lIGZpbHRlcihwYXJlbnQgIT0gIiIpICU+JQogICAgICAgICAgICAgICAgICAgICB1bmdyb3VwKCkgJT4lCiAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChOYW1lID0gcGFyZW50KSAlPiUgZGlzdGluY3QoKSAlPiUgbXV0YXRlKG49MCwgcGFyZW50ID0gIiIpKQpgYGAKCgojIyBIZWFsdGggYW5kIENsaW5pY2FsIFBzeWNob2xvZ3kKIyMjIE5vcm1hbGl6ZWQgU2hhbm5vbiBlbnRyb3B5IGByIHNwcmludGYoIiRcXGV0YShYKSA9ICUuMmYkIiwgbm9ybV9lbnRyb3B5KWAKYGBge3IsIG91dC53aWR0aD0nMTAwJSd9CmZpZyA8LSBwbG90X2x5KAogIHR5cGU9J3RyZWVtYXAnLAogIGxhYmVscyA9IHRlc3RzJE5hbWUsCiAgcGFyZW50cyA9IHRlc3RzJHBhcmVudCwKICB2YWx1ZXM9IHRlc3RzJG4sCiAgdGV4dCA9IHRlc3RzJERPSSwKICB0aWxpbmcgPSBsaXN0KHBhY2tpbmcgPSAic3F1YXJpZnkiLCBzcXVhcmlmeXJhdGlvID0gKDEgKyBzcXJ0KDUpKSAvIDIpLAogIGhvdmVyaW5mbz0ibGFiZWwrdmFsdWUrdGV4dCIsCiAgdGV4dGluZm89ImxhYmVsK3ZhbHVlIikKCmZpZyAlPiUgbGF5b3V0KAogIGF1dG9zaXplID0gVFJVRSwKICBtYXJnaW4gPSBsaXN0KGwgPSAwLCB0ID0gMCwgciA9IDAgLCBiID0gMCkKKQpgYGAKCgpgYGB7cn0KdGVzdHMgPC0gcHN5Y3Rlc3RzX2luZm8gJT4lCiAgZmlsdGVyKHN1YmRpc2NpcGxpbmVfMSA9PSAiRWR1Y2F0aW9uYWwgYW5kIERldmVsb3BtZW50YWwgUHN5Y2hvbG9neSIpICU+JQogIGdyb3VwX2J5KERPSSwgTmFtZSkgJT4lCiAgc3VtbWFyaXNlKG4gPSBzdW0odXNhZ2VfY291bnQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIHBhcmVudCA9IGNhc2Vfd2hlbigKICAgICAgICAgICAgICAgICAgICBuID4gMjAgfiAiIiwKICAgICAgICAgICAgICAgICAgICBuID4gNSB+ICJ1c2VkIDYtMjAgdGltZXMiLAogICAgICAgICAgICAgICAgICAgIFRSVUUgfiAidXNlZCAxLTUgdGltZXMiKSkKZW50cm9weSA9IGVudHJvcHkodGVzdHMkbikKbm9ybV9lbnRyb3B5ID0gY2FsY19ub3JtX2VudHJvcHkodGVzdHMkbikKCnRlc3RzIDwtIGJpbmRfcm93cyh0ZXN0cywKICAgICAgICAgICAgICAgICAgIHRlc3RzICU+JSBmaWx0ZXIocGFyZW50ICE9ICIiKSAlPiUKICAgICAgICAgICAgICAgICAgICAgdW5ncm91cCgpICU+JQogICAgICAgICAgICAgICAgICAgICBzZWxlY3QoTmFtZSA9IHBhcmVudCkgJT4lIGRpc3RpbmN0KCkgJT4lIG11dGF0ZShuPTAsIHBhcmVudCA9ICIiKSkKYGBgCgoKIyMgRWR1Y2F0aW9uYWwgYW5kIERldmVsb3BtZW50YWwgUHN5Y2hvbG9neQojIyMgTm9ybWFsaXplZCBTaGFubm9uIGVudHJvcHkgYHIgc3ByaW50ZigiJFxcZXRhKFgpID0gJS4yZiQiLCBub3JtX2VudHJvcHkpYApgYGB7ciwgb3V0LndpZHRoPScxMDAlJ30KZmlnIDwtIHBsb3RfbHkoCiAgdHlwZT0ndHJlZW1hcCcsCiAgbGFiZWxzID0gdGVzdHMkTmFtZSwKICBwYXJlbnRzID0gdGVzdHMkcGFyZW50LAogIHZhbHVlcz0gdGVzdHMkbiwKICB0ZXh0ID0gdGVzdHMkRE9JLAogIHRpbGluZyA9IGxpc3QocGFja2luZyA9ICJzcXVhcmlmeSIsIHNxdWFyaWZ5cmF0aW8gPSAoMSArIHNxcnQoNSkpIC8gMiksCiAgaG92ZXJpbmZvPSJsYWJlbCt2YWx1ZSt0ZXh0IiwKICB0ZXh0aW5mbz0ibGFiZWwrdmFsdWUiKQoKZmlnICU+JSBsYXlvdXQoCiAgYXV0b3NpemUgPSBUUlVFLAogIG1hcmdpbiA9IGxpc3QobCA9IDAsIHQgPSAwLCByID0gMCAsIGIgPSAwKQopCmBgYAoKYGBge3J9CnRlc3RzIDwtIHBzeWN0ZXN0c19pbmZvICU+JQogIGZpbHRlcihzdWJkaXNjaXBsaW5lXzEgPT0gIkNvZ25pdGl2ZSBQc3ljaG9sb2d5IikgJT4lCiAgZ3JvdXBfYnkoRE9JLCBOYW1lKSAlPiUKICBzdW1tYXJpc2UobiA9IHN1bSh1c2FnZV9jb3VudCwgbmEucm0gPSBUKSwKICAgICAgICAgICAgcGFyZW50ID0gY2FzZV93aGVuKAogICAgICAgICAgICAgICAgICAgIG4gPiAyMCB+ICIiLAogICAgICAgICAgICAgICAgICAgIG4gPiA1IH4gInVzZWQgNi0yMCB0aW1lcyIsCiAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJ1c2VkIDEtNSB0aW1lcyIpKQplbnRyb3B5ID0gZW50cm9weSh0ZXN0cyRuKQpub3JtX2VudHJvcHkgPSBjYWxjX25vcm1fZW50cm9weSh0ZXN0cyRuKQoKdGVzdHMgPC0gYmluZF9yb3dzKHRlc3RzLAogICAgICAgICAgICAgICAgICAgdGVzdHMgJT4lIGZpbHRlcihwYXJlbnQgIT0gIiIpICU+JQogICAgICAgICAgICAgICAgICAgICB1bmdyb3VwKCkgJT4lCiAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChOYW1lID0gcGFyZW50KSAlPiUgZGlzdGluY3QoKSAlPiUgbXV0YXRlKG49MCwgcGFyZW50ID0gIiIpKQpgYGAKCgojIyBDb2duaXRpdmUgUHN5Y2hvbG9neQojIyMgTm9ybWFsaXplZCBTaGFubm9uIGVudHJvcHkgYHIgc3ByaW50ZigiJFxcZXRhKFgpID0gJS4yZiQiLCBub3JtX2VudHJvcHkpYApgYGB7ciwgb3V0LndpZHRoPScxMDAlJ30KZmlnIDwtIHBsb3RfbHkoCiAgdHlwZT0ndHJlZW1hcCcsCiAgbGFiZWxzID0gdGVzdHMkTmFtZSwKICBwYXJlbnRzID0gdGVzdHMkcGFyZW50LAogIHZhbHVlcz0gdGVzdHMkbiwKICB0ZXh0ID0gdGVzdHMkRE9JLAogIHRpbGluZyA9IGxpc3QocGFja2luZyA9ICJzcXVhcmlmeSIsIHNxdWFyaWZ5cmF0aW8gPSAoMSArIHNxcnQoNSkpIC8gMiksCiAgaG92ZXJpbmZvPSJsYWJlbCt2YWx1ZSt0ZXh0IiwKICB0ZXh0aW5mbz0ibGFiZWwrdmFsdWUiKQoKZmlnICU+JSBsYXlvdXQoCiAgYXV0b3NpemUgPSBUUlVFLAogIG1hcmdpbiA9IGxpc3QobCA9IDAsIHQgPSAwLCByID0gMCAsIGIgPSAwKQopCmBgYAoK